/**
 * @作者 zxy
 * @时间 2023-05-03 16:10
 * @说明 59. 螺旋矩阵 II
 * 给你一个正整数 n ，生成一个包含 1 到 n2 所有元素，且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
 * 示例 1：
 * 输入：n = 3
 * 输出：[[1,2,3],[8,9,4],[7,6,5]]
 * 示例 2：
 * 输入：n = 1
 * 输出：[[1]]
 */
public class Solution {
    /**
     * 执行用时:
     * 0 ms ,在所有Java提交中击败了100.00%的用户
     * 内存消耗:
     * 39.8 MB , 在所有Java提交中击败了5.75%的用户
     *
     * @param n
     * @return
     */
    public int[][] generateMatrix(int n) {
        int row = n;
        int column = n;
        int i = 0, j = 0;
        int num = 0;
        int[][] res = new int[row][column];
        int direction = 1;
        while (num < row * column) {
            res[i][j] = num + 1;
            num++;
            if (direction == 1) {
                if (j + 1 < column && res[i][j + 1] == 0) {
                    j++;
                } else if (i + 1 < row && res[i + 1][j] == 0) {
                    i++;
                    direction = 2;
                } else if (j - 1 >= 0 && res[i][j - 1] == 0) {
                    j--;
                    direction = 3;
                } else if (i - 1 >= 0 && res[i - 1][j] == 0) {
                    i--;
                    direction = 4;
                }
            } else if (direction == 2) {
                if (i + 1 < row && res[i + 1][j] == 0) {
                    i++;
                } else if (j - 1 >= 0 && res[i][j - 1] == 0) {
                    j--;
                    direction = 3;
                } else if (i - 1 >= 0 && res[i - 1][j] == 0) {
                    i--;
                    direction = 4;
                } else if (j + 1 < column && res[i][j + 1] == 0) {
                    j++;
                    direction = 1;
                }
            } else if (direction == 3) {
                if (j - 1 >= 0 && res[i][j - 1] == 0) {
                    j--;
                } else if (i - 1 >= 0 && res[i - 1][j] == 0) {
                    i--;
                    direction = 4;
                } else if (j + 1 < column && res[i][j + 1] == 0) {
                    j++;
                    direction = 1;
                } else if (i + 1 < row && res[i + 1][j] == 0) {
                    i++;
                    direction = 2;
                }
            } else {
                if (i - 1 >= 0 && res[i - 1][j] == 0) {
                    i--;
                } else if (j + 1 < column && res[i][j + 1] == 0) {
                    j++;
                    direction = 1;
                } else if (i + 1 < row && res[i + 1][j] == 0) {
                    i++;
                    direction = 2;
                } else if (j - 1 >= 0 && res[i][j - 1] == 0) {
                    j--;
                    direction = 3;
                }
            }
        }
        return res;
    }
}
